package com.configtools.service;

import com.configtools.model.ConfigSettings;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 配置管理服务
 * 负责配置的加载、保存和管理
 * 
 * @author ConfigTools
 */
@Slf4j
public class ConfigService {
    
    /** 配置文件目录 */
    private static final String CONFIG_DIR = "config";
    
    /** 配置文件名 */
    private static final String CONFIG_FILE = "settings.yml";
    
    /** 完整的配置文件路径 */
    private static final String CONFIG_PATH = CONFIG_DIR + "/" + CONFIG_FILE;
    
    /** YAML对象映射器 */
    private static final ObjectMapper YAML_MAPPER = new ObjectMapper(new YAMLFactory());
    
    /** 当前配置实例 */
    private ConfigSettings currentSettings;
    
    /**
     * 获取当前配置设置
     * 如果尚未加载，则自动加载
     * 
     * @return 当前配置设置
     */
    public ConfigSettings getCurrentSettings() {
        if (currentSettings == null) {
            currentSettings = loadSettings();
        }
        return currentSettings;
    }
    
    /**
     * 更新配置设置
     * 
     * @param settings 新的配置设置
     */
    public void updateSettings(ConfigSettings settings) {
        this.currentSettings = settings.copy();
        log.info("配置设置已更新");
    }
    
    /**
     * 从配置文件加载设置
     * 
     * @return 加载的配置设置
     */
    public ConfigSettings loadSettings() {
        try {
            Path configPath = Paths.get(CONFIG_PATH);
            if (!Files.exists(configPath)) {
                log.info("配置文件不存在，使用默认配置: {}", CONFIG_PATH);
                return ConfigSettings.createDefault();
            }
            
            // 从YAML文件加载配置
            ConfigSettings settings = YAML_MAPPER.readValue(configPath.toFile(), ConfigSettings.class);
            log.info("成功加载配置文件: {}", CONFIG_PATH);
            return settings;
            
        } catch (IOException e) {
            log.error("加载配置文件失败: {}", CONFIG_PATH, e);
            return ConfigSettings.createDefault();
        }
    }
    
    /**
     * 保存设置到配置文件
     * 
     * @param settings 要保存的配置设置
     * @return 是否保存成功
     */
    public boolean saveSettings(ConfigSettings settings) {
        try {
            // 确保配置目录存在
            Path configDir = Paths.get(CONFIG_DIR);
            if (!Files.exists(configDir)) {
                Files.createDirectories(configDir);
                log.info("创建配置目录: {}", CONFIG_DIR);
            }
            
            // 保存为YAML文件
            Path configPath = Paths.get(CONFIG_PATH);
            YAML_MAPPER.writeValue(configPath.toFile(), settings);
            
            log.info("成功保存配置文件: {}", CONFIG_PATH);
            
            // 更新当前设置
            updateSettings(settings);
            return true;
            
        } catch (IOException e) {
            log.error("保存配置文件失败: {}", CONFIG_PATH, e);
            return false;
        }
    }
    
    /**
     * 重置配置为默认值
     * 
     * @return 重置后的配置设置
     */
    public ConfigSettings resetToDefault() {
        log.info("重置配置为默认值");
        ConfigSettings defaultSettings = ConfigSettings.createDefault();
        updateSettings(defaultSettings);
        return defaultSettings;
    }
    
    /**
     * 更新最后选择的Excel目录
     * 
     * @param directory 目录路径
     */
    public void updateLastExcelDirectory(String directory) {
        if (currentSettings != null && directory != null) {
            currentSettings.setLastExcelDirectory(directory);
            // 异步保存设置
            saveSettingsAsync();
        }
    }
    
    /**
     * 更新最后选择的输出目录
     * 
     * @param directory 目录路径
     */
    public void updateLastOutputDirectory(String directory) {
        if (currentSettings != null && directory != null) {
            currentSettings.setLastOutputDirectory(directory);
            // 异步保存设置
            saveSettingsAsync();
        }
    }
    
    /**
     * 异步保存设置
     */
    private void saveSettingsAsync() {
        if (currentSettings != null) {
            // 在后台线程保存设置，避免阻塞UI
            new Thread(() -> saveSettings(currentSettings)).start();
        }
    }
    
    /**
     * 验证配置设置的有效性
     * 
     * @param settings 要验证的配置设置
     * @return 验证结果消息，如果返回null表示验证通过
     */
    public String validateSettings(ConfigSettings settings) {
        if (settings == null) {
            return "配置设置不能为空";
        }
        
        // 验证包名
        if (!settings.isValidPackageName()) {
            return "包名格式不正确，请使用小写字母、数字和点号，如: com.example.config";
        }
        
        // 验证类名前缀
        if (!settings.isValidClassPrefix()) {
            return "类名前缀格式不正确，请使用字母开头的标识符";
        }
        
        // 验证类名后缀
        if (!settings.isValidClassSuffix()) {
            return "类名后缀格式不正确，请使用字母开头的标识符";
        }
        
        // 验证作者名称
        if (settings.getAuthorName() == null || settings.getAuthorName().trim().isEmpty()) {
            return "作者信息不能为空";
        }
        
        return null; // 验证通过
    }
    
    /**
     * 获取配置文件路径
     * 
     * @return 配置文件的完整路径
     */
    public String getConfigFilePath() {
        return CONFIG_PATH;
    }
    
    /**
     * 检查配置文件是否存在
     * 
     * @return 是否存在配置文件
     */
    public boolean configFileExists() {
        return Files.exists(Paths.get(CONFIG_PATH));
    }
}
